/**
 * @author        Nicolas Bottarini <nicolasbottarini@gmail.com>, 404 <http://www.proyecto404.com>
 * @version       $Rev: 3 $
 * @lastrevision  $Date: 2011-09-12 16:45:37 +0000 (Mon, 12 Sep 2011) $	 
 */
package com.proyecto404.core.ui.controls {
	import com.proyecto404.core.collections.IIterator;
	import com.proyecto404.core.exception.InvalidOperationException;
	
	import flash.display.FrameLabel;
	import flash.display.MovieClip;
	import flash.events.MouseEvent;
	
	public class SimpleButton extends ButtonBase {
		
		private var _overing:Boolean;
		private var _outing:Boolean;
		private var _pendingAction:Function;
		
		public function SimpleButton() {
			super();
		}
		
		protected override function onOver(e:MouseEvent):void {
			if (!enabled) {
				return;
			}

			doOver();
		}
		
		protected override function onOut(e:MouseEvent):void {
			if (!enabled) {
				return;
			}

			if (!labels.containsKey("out")) {
				gotoAndStop("active");
			} else {
				doOut();
			}
		}
		
		private function doOver():void {
			// Si esta la animacion de out agrego el pending action de over
			if (_outing) {
				_pendingAction = doOver;
				return;
			}
			
			// Hay un único frame de over
			if (labels.get("over").frame == overLastFrame) {
				gotoAndStop("over");
			} else {
				// Si hay over y se esta ejecutando la animacion de over ignoro el over 
				if (_overing) {
					return;
				}
				_overing = true;
				registerFrameFunction(overLastFrame , function():void {
					_overing = false;
					// Si mientras se hizo el over hubo un out hago el out
					if (_pendingAction != null) {
						_pendingAction.call(this);
					} else {
						stop();	
					}
				});
				_pendingAction = null;
				gotoAndPlay("over");
			}
		}
		
		private function doOut():void {
			// Si esta la animacion de over agrego el pending action de out
			if (_overing) {
				_pendingAction = doOut;
				return;
			}
			
			// Hay un único frame de out
			if (labels.get("out").frame == outLastFrame) {
				gotoAndStop("active");
			} else {
				// Si hay out y se esta ejecutando la animacion de out ignoro el out
				if (_outing) {
					return;
				}
				_outing = true;
				registerFrameFunction(outLastFrame, function():void {
					_outing = false;
					// Si mientras se hizo el out hubo un over hago el over
					if (_pendingAction != null) {
						_pendingAction.call(this);
					} else {
						gotoAndStop("active");
					}
				});
				_pendingAction = null;
				gotoAndPlay("out");
			}
		}
	}
}